package parser.prestige;

import parser.Parser;
import parser.prestige.meldunek.xml.Meldunek;
import parser.prestige.technologia.xml.BomItem;
import parser.prestige.technologia.xml.OperacjaTech;
import parser.prestige.technologia.xml.ProduktTech;
import parser.prestige.technologia.xml.Technologia;

import javax.xml.stream.XMLEventFactory;
import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartDocument;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

/**
 * Created with IntelliJ IDEA.
 * User: msi
 * Date: 10.12.13
 * Time: 17:05
 * To change this template use File | Settings | File Templates.
 */
public class TechnologiaParser extends Parser {
    Technologia technologia = null;
    @Override
    public List<AbstractNode> parseInput(List<String> lines, String inputFileName) {
        List<AbstractNode> nodes = new ArrayList<AbstractNode>();


//        List<BomItem>items = new ArrayList<BomItem>();
//        items.add(new BomItem("indeks", "nazwa", "kodMagazyn", "ilosc", "cena", "narzut", "rodzajMat", "rodzajCeny", "rodzajRealiz", "przelacznik"));
//
//        List<OperacjaTech>operacje = new ArrayList<OperacjaTech>();
//        operacje.add(new OperacjaTech(
//                "kodOperacja", "kodMeldunekS1", "produktTechIndeks", "produktTechNazwa", "produktTechLp", "bomItemIndeks", "bomItemNazwa", "bomItemLp",
//                "ilosc", "czas", "sposobWyceny", "sposobCzasu", "nieWliczajDoKosztow", "uwagi", items, new ProduktTech()
//        ));
//
//        nodes.add(new Technologia(
//                "9",
//                "nrTechnologii",
//                "kodWydzialu",
//                "indeksKartoteki",
//                "indeks",
//                "nazwa",
//                "ilosc",
//                "iloscUzasadnionatechnologicznie",
//                "czas",
//                "przelacznik1",
//                "uwagi",
//                operacje
//        ));
//        for (String line : lines) {
//            //NAGŁÓWEK linie 1-13
//            //System.out.println(line.replaceAll("\\s"," "));
//            //System.out.println(line.split("\\s+").length);
//        }

        /**
         * WERSJA 03
         */
        String index = extractIndexFromFilename(inputFileName);
//        String name = extractName(lines.get(17)+" "+lines.get(18));
        String name = extractName(lines.get(10));

        technologia = new Technologia();
        technologia.setNumerWersjiXML("1");
        technologia.setNrTechnologii("");//POLE w FORMULARZU!
        technologia.setNazwaTechnologii("");
        technologia.setIndeks(index);
        technologia.setNazwa(name);//w tej wersji 18+19 linia jest linia z nazwa technologii
//        technologia.setNazwa("");//POLE W FORMULARZU
        technologia.setIlosc("1");
        technologia.setIloscUzasadnionaTechnologicznie("0");
        technologia.setCzas("1899-12-13");
        technologia.setGlowna("0");
        technologia.setPrzelacznik1("");
        technologia.setUwagi("");

        OperacjaTech operacjaTech = new OperacjaTech();
        operacjaTech.setKodOperacja("00");
        operacjaTech.setKodMeldunekS1("1");
        operacjaTech.setProduktTechIndeks(index);
        operacjaTech.setProduktTechNazwa(name);
        operacjaTech.setProduktTechLp("1");
        operacjaTech.setIlosc("1");
        operacjaTech.setCzas("0:00");
        operacjaTech.setSposobWyceny("0");
        operacjaTech.setSposobCzasu("0");
        operacjaTech.setNieWliczajDoKosztow("0");
        operacjaTech.setUwagi("");

        List<BomItem> items = new ArrayList<BomItem>();
        for (int i = 15; ; i++){//bom itemy zaczynaja sie od 16 linii w pliku, dla linii pojedynczej
//            for (int i = 26; ; i+=2){//bom itemy zaczynaja sie od 27 linii w pliku, dla linii lamanej
//            String line = lines.get(i)+" "+lines.get(i+1);//dla linii lamanej
            String line = lines.get(i);//dla linii pojedynczej
            if (line.trim().split("\\s+")[0].equalsIgnoreCase("------") || line.trim().length() == 0) {
                //koniec listy produktow
                break;
            }
            BomItem bomItem = new BomItem();

            bomItem.setIndeks(extractBomIndex(line));
            bomItem.setNazwa(extractBomName(line));
//            bomItem.setNazwa("");//POLA W FORMULARZU
            bomItem.setKodMagazyn("DZ");
            bomItem.setIlosc(extractBomQuantity(line));
            bomItem.setCena("0");
            bomItem.setNarzut("0");
            bomItem.setRodzajMat("0");
            bomItem.setRodzajCeny("0");
            bomItem.setRodzajRealiz("0");
            bomItem.setPrzelacznik("0");

            items.add(bomItem);
        }

        operacjaTech.setItems(items);

        ProduktTech produktTech = new ProduktTech();
        produktTech.setIndeks(index);
        produktTech.setNazwa(name);
//        produktTech.setNazwa("");
        produktTech.setKodMagazyn("DZ");
        produktTech.setIlosc("1");
        produktTech.setNarzut("0");
        produktTech.setRezerwuj("0");
        produktTech.setRodzajProd("0");
        produktTech.setPrzelacznik1("0");

        operacjaTech.setProduktTech(produktTech);

        List<OperacjaTech> operacje = new ArrayList<OperacjaTech>();
        operacje.add(operacjaTech);
        technologia.setOperacje(operacje);

        /**
         * KONIEC WERSJI 03
         */
        nodes.add(technologia);
        return nodes;
    }

    private String extractBomQuantity(String line) {
//        System.out.println("=========Extracting BomTitem Quantity from\n\t"+line);
//        String quantity = line.substring(32,39).trim();//wersja z lamaniem linii
        String quantity = line.substring(32,39).trim();
//        System.out.println(quantity);
        float fQuantity = Float.parseFloat(quantity);
        fQuantity /= 1000;
        quantity = String.format(Locale.US,"%.3f", fQuantity);
//        System.out.println("Result: "+quantity);
        return quantity;
    }

    private String extractBomName(String line) {
//        System.out.println("==========\nExtracting BomItem Name from:\n\t"+line);
        String name = line.substring(11, 32).trim();
//        System.out.println("Result: "+name);
        return name;
    }

    private String extractBomIndex(String line) {
//        System.out.println("==========\nExtracting BomItem Index from:\n\t"+line);
        line = line.trim();
        String index = line.split("\\s+")[0];
        index = index.split("_")[1];
//        System.out.println("Result: "+index);
        return index;
    }

    private String extractName(String line) {
//        System.out.println("==========\nExtracting Name from:\n\t" + line);
        String split = line.split(":", 0)[2];
        //usun "LP Solution" z konca
        split = split.replace("LP Solution", "").trim();
//        System.out.println("Result: " + split);
        return split;
    }

    @Override
    public void writeOutput(List<AbstractNode> nodes) {
        System.out.println("TechnologiaParser:writingOutput");
        XMLOutputFactory outputfactory = XMLOutputFactory.newInstance();
        try {
            XMLEventWriter eventWriter = outputfactory.createXMLEventWriter(
                    new FileOutputStream((outputFileName == null) ? inputFileName.replace(".txt",".xml") : outputFileName));
            XMLEventFactory eventFactory = XMLEventFactory.newInstance();

            XMLEvent endLineEvent = eventFactory.createDTD("\n");
            XMLEvent tabulatorEvent = eventFactory.createDTD("\t");

            StartDocument startDocument = eventFactory.createStartDocument();//TU MOZNA DOROBIC KODOWANIE
            eventWriter.add(startDocument);

            //lamanie lini po xml version ...
            eventWriter.add(endLineEvent);

//            //TAG: <Technologie>
            StartElement technologieStartElement = eventFactory.createStartElement("", "", "Technologie");
            eventWriter.add(technologieStartElement);
            eventWriter.add(endLineEvent);
//
//            //TAG:<NumerWersjiXML>
//            eventWriter.add(tabulatorEvent);
//            StartElement startElement = eventFactory.createStartElement("", "", "NumerWersjiXML");
//            eventWriter.add(startElement);
//            eventWriter.add(eventFactory.createCharacters("9"));
//            eventWriter.add(eventFactory.createEndElement("","","NumerWersjiXML"));
//            eventWriter.add(endLineEvent);

            //spisz technologie
            for (AbstractNode node : nodes) {
                Technologia tech = (Technologia)node;
                tech.createAsNode(eventWriter, 1);
            }

            //TAG: </Technologie>
            EndElement technologieEndElement = eventFactory.createEndElement("", "", "Technologie");
            eventWriter.add(technologieEndElement);
            eventWriter.add(endLineEvent);

            //zapisaine dokumentu
            eventWriter.add(eventFactory.createEndDocument());
            eventWriter.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        } catch (XMLStreamException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }

    }

    /**
     * Wyciąga z nazwy pliku Indeks technologii, pierwszy napotkany ciąg cyfr
     * @param inputFilename
     * @return
     */
//    private String extractIndexFromFilename(String inputFilename) {
//        String[] splits = inputFilename.split("\\\\");
//        String split = splits[splits.length - 1];
////        split = "Grower mięsny I 5239 GR  ver 01_14Spec.txt";
////        System.out.println(split);
//        splits = split.split("\\D+");
////        split = split.replaceAll("\\D+","");
//        if (splits.length < 2) {
//            System.out.println("Nie wyciągnięto indeksu z nazwy pliku");
//            return "0000";
//        }
//        split = splits[1];
//        System.out.println(split);
//        return split;
//    }

    /**
     * Wyciąga z nazwy pliku Indeks technologii, pierwszy napotkany ciąg cyfr
     * @param inputFilename
     * @return
     */
    private String extractIndexFromFilename(String inputFilename) {
//        System.out.println("==========\nExtracting Index form:\n\t" + inputFilename);
        String[] splits = inputFilename.split("\\\\");
        inputFilename = splits[splits.length - 1];
        StringBuilder sb = new StringBuilder(inputFilename.length());
        boolean firstDigitChainFlag = false;
        for (int i = 0; i < inputFilename.length(); i++) {
            char c = inputFilename.charAt(i);
            if (c > 47 && c < 58) {
                sb.append(c);
                firstDigitChainFlag = true;
            } else {
                if (firstDigitChainFlag == true) {//koniec ciagu cyfr
                    break;
                }
            }
        }
//        System.out.println("Extract Index Result: " + sb.toString());
        return sb.toString();
    }

    public Technologia getTechnologia() {
        return technologia;
    }

}
